/**
 * @license
 * Copyright (C) 2018 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import '@polymer/iron-input/iron-input.js';
import '@polymer/paper-toggle-button/paper-toggle-button.js';
import '../../../styles/gr-form-styles.js';
import '../../../styles/shared-styles.js';
import '../../shared/gr-button/gr-button.js';
import {dom} from '@polymer/polymer/lib/legacy/polymer.dom.js';
import {GestureEventListeners} from '@polymer/polymer/lib/mixins/gesture-event-listeners.js';
import {LegacyElementMixin} from '@polymer/polymer/lib/legacy/legacy-element-mixin.js';
import {PolymerElement} from '@polymer/polymer/polymer-element.js';
import {htmlTemplate} from './gr-plugin-config-array-editor_html.js';

/** @extends PolymerElement */
class GrPluginConfigArrayEditor extends GestureEventListeners(
    LegacyElementMixin(
        PolymerElement)) {
  static get template() { return htmlTemplate; }

  static get is() { return 'gr-plugin-config-array-editor'; }
  /**
   * Fired when the plugin config option changes.
   *
   * @event plugin-config-option-changed
   */

  static get properties() {
    return {
    /** @type {?} */
      pluginOption: Object,
      /** @type {boolean} */
      disabled: {
        type: Boolean,
        computed: '_computeDisabled(pluginOption.*)',
      },
      /** @type {?} */
      _newValue: {
        type: String,
        value: '',
      },
    };
  }

  _computeDisabled(record) {
    return !(record && record.base && record.base.info &&
        record.base.info.editable);
  }

  _handleAddTap(e) {
    e.preventDefault();
    this._handleAdd();
  }

  _handleInputKeydown(e) {
    // Enter.
    if (e.keyCode === 13) {
      e.preventDefault();
      this._handleAdd();
    }
  }

  _handleAdd() {
    if (!this._newValue.length) { return; }
    this._dispatchChanged(
        this.pluginOption.info.values.concat([this._newValue]));
    this._newValue = '';
  }

  _handleDelete(e) {
    const value = dom(e).localTarget.dataset.item;
    this._dispatchChanged(
        this.pluginOption.info.values.filter(str => str !== value));
  }

  _dispatchChanged(values) {
    const {_key, info} = this.pluginOption;
    const detail = {
      _key,
      info: Object.assign(info, {values}, {}),
      notifyPath: `${_key}.values`,
    };
    this.dispatchEvent(
        new CustomEvent('plugin-config-option-changed', {detail}));
  }

  _computeShowInputRow(disabled) {
    return disabled ? 'hide' : '';
  }
}

customElements.define(GrPluginConfigArrayEditor.is,
    GrPluginConfigArrayEditor);
